package com.jml.mapreduce.自定义序列化;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import org.apache.hadoop.io.Writable;

// 1 实现writable接口

/**
 * ● 有一个文件：
 *   ○ 文件内容是：序号  电话号码          访问者ip       访问的网站  上行流量  下行流量  状态码
 *   ○           7 	13560436666	120.196.100.99		        1116	 954	 200
 *   ○           8 	13560436667	120.196.100.98		        1215	 154	 200
 * ● 需求：统计每个手机号耗费的总上行流量，总下行流量，总流量
 *   ○ 期望输出数据格式:
 *     ■ 手机号码		    上行流量        下行流量		总流量
 *     ■ 13560436666 	     1116		    954 			 2070
 *   ○ key是电话号码，value是三种流量,这里可以用一个对象来装3个字段
 */
public class FlowBean implements Writable,Comparable<FlowBean>{
    //上行流量
    private long upFlow;
    //下行流量
    private long downFlow;
    //总流量
    private long sumFlow;

    //2  反序列化时，需要反射调用空参构造函数，所以必须有
    public FlowBean() {
        super();
    }

    public FlowBean(long upFlow, long downFlow) {
        super();
        this.upFlow = upFlow;
        this.downFlow = downFlow;
        this.sumFlow = upFlow + downFlow;
    }

    //3  写序列化方法
    @Override
    public void write(DataOutput out) throws IOException {
        out.writeLong(upFlow);
        out.writeLong(downFlow);
        out.writeLong(sumFlow);
    }

    //4 反序列化方法
    //5 反序列化方法读顺序必须和写序列化方法的写顺序必须一致
    @Override
    public void readFields(DataInput in) throws IOException {
        this.upFlow  = in.readLong();
        this.downFlow = in.readLong();
        this.sumFlow = in.readLong();
    }

    // 6 编写toString方法，方便后续打印到文本
    @Override
    public String toString() {
        return upFlow + "\t" + downFlow + "\t" + sumFlow;
    }

    public long getUpFlow() {
        return upFlow;
    }

    public void setUpFlow(long upFlow) {
        this.upFlow = upFlow;
    }

    public long getDownFlow() {
        return downFlow;
    }

    public void setDownFlow(long downFlow) {
        this.downFlow = downFlow;
    }

    public long getSumFlow() {
        return sumFlow;
    }

    public void setSumFlow(long sumFlow) {
        this.sumFlow = sumFlow;
    }

    //如果需要将自定义的bean放在key中传输，则还需要实现Comparable接口，
    // 因为MapReduce框中的Shuffle过程要求对key必须能排序。
    @Override
    public int compareTo(FlowBean o) {
        // 倒序排列，从大到小
        return this.sumFlow > o.getSumFlow() ? -1 : 1;
    }
}
